<?php
class User_Controller extends Base_Controller
{
    public $restful = true;

    public function __construct()
    {
        parent::__construct();

        // Yêu cầu đăng nhập ngoại trừ 1 số thao tác
        $this->filter('before', 'auth')
            ->except(
                array(
                    'login',
                    'register',
                    'forgot',
                    'exists',
                    'recover'
                )
            );
    }

    public function get_login()
    {
        return View::make('user.login')->with('title', 'Đăng nhập');
    }

    public function post_login()
    {
        $input = array(
            'username' => Input::get('username'),
            'password' => Input::get('password'),
            'remember' => Input::get('remember') == 'true'
        );

        $rules = array(
            'username' => 'required|min:3|max:64',
            'password' => 'required|min:4|max:64'
        );
        $validator = Validator::make($input, $rules);
        if ($validator->fails()) {
            return Redirec::to('dang-nhap')->with_errors($validator);
        } else {

            $status = MyAuth::attempt($input);

            // Respons for ajax request
            if (Request::ajax()) {
                return Response::json(array(
                    'code' => $status ? 1 : -1,
                    'redirect_url' => pre_login_url()
                ));
            } else {
                if ($status) {
                    return Shared::make_message(array(
                        'title' => 'Đăng nhâp',
                        'content' => 'Đang nhập thành công, chào bạn <strong>' . MyAuth::user()->display_name . '</strong>',
                        'redirect_url' => pre_login_url(),
                    ));
                } else {
                    return Shared::make_message(array(
                        'title' => 'Đăng nhâp',
                        'content' => 'Sai tên đăng nhập hoặc mật khẩu. Vui lòng kiểm tra lại!',
                        'redirect_url' => 'dang-nhap',
                        'redirect_timeout' => 5,
                        'type' => 'error'
                    ));
                }
            }
        }
    }

    public function get_logout()
    {
        MyAuth::logout();
        return Shared::make_message(array(
            'content' => 'Đăng xuất thành công!',
            'title' => 'Đăng xuất',
            'redirect_url' => 'dang-nhap',
        ));
    }

    public function get_register()
    {
        return View::make('user.register')
            ->with('title', 'Đăng ký tài khoản');
    }

    public function post_register()
    {
        $rules = array(
            'username' => 'required|min:3|max:64|unique:users,username',
            'password' => 'required|min:4|max:64',
            'repassword' => 'same:password',
            'displayname' => 'min:3|max:128',
            'email' => 'required|email|unique:users,email',
            'phone' => 'min:100000000|max:99999999999|numeric',
            'gender' => 'in:0,1',
            'captcha' => 'required|captcha',
        );

        $validator = Validator::make(Input::get(), $rules, Config::get('messages'));

        if ($validator->invalid()) {
            return Redirect::to(URI::current())->with_input()->with_errors($validator);
        }




        $user_info = array(
            'username' => Input::get('username'),
            'password' => Input::get('password'),
            'display_name' => Input::get('displayname'),
            'email' => Input::get('email'),
            'phone' => Input::get('phone'),
            'gender' => Input::get('gender', 0),
        );

        $group = Group::find(MyAuth::USER);
        if (Input::has("owner")) {
            $group = Group::find(MyAuth::OWNER);
        }

        $user = $group->users()->insert($user_info);
        MyAuth::login($user);

        return Shared::make_message(array(
            'content' => 'Đăng ký người dùng thành công!',
            'redirect_url' => '/',
            'redirect_timeout' => '60',
            'title' => 'Đăng ký'
        ));
    }

    public function get_update()
    {
        if (MyAuth::guest()) {
            return Redirect::to('/');
        }

        return View::make('user.register')->with('user', MyAuth::user())->with('updating', true);
    }

    public function post_update()
    {
        $rules = array(
            'username' => 'required|min:3|max:64',
            'displayname' => 'min:3|max:128',
            'email' => 'required|email',
            'phone' => 'min:100000000|max:99999999999|numeric',
            'gender' => 'in:0,1'
        );

        $validator = Validator::make(Input::get(), $rules, User::$error_messages);
        if ($validator->fails()) {
            return Redirect::to('cap-nhat')->with_errors($validator)->with_input();
        } else {
            // Kiểm tra trùng lặp username & email
            if (MyAuth::user()->username !== Input::get('username') && User::exists('username', Input::get('username'))) {
                $validator->errors->add('username', 'Tên đăng nhập đã tồn tại, vui lòng chọn tên khác');
            }
            if (MyAuth::user()->email !== Input::get('email') && User::exists('email', Input::get('email'))) {
                $validator->errors->add('email', 'Đia chỉ email đã tồn tại, vui lòng dùng địa chỉ khác!');
            }

            if ($validator->errors->has('username') || $validator->errors->has('email')) {
                return Redirect::to('cap-nhat')->with_errors($validator->errors)->with_input();
            }

            $user = MyAuth::user();
            $user->username = Input::get('username');
            $user->display_name = Input::get('displayname');
            $user->email = Input::get('email');
            $user->phone = Input::get('phone');
            $user->gender = Input::get('gender');
            $user->save();

            Return Shared::make_message(array(
                'content' => 'Cập nhật thông tin thành công!',
                'title' => 'Cập nhật',
                'redirect_url' => '/'
            ));
        }
    }

    public function get_change()
    {
        if (MyAuth::guest()) return Redirect::to('/');

        return View::make('user.change')->with('title', 'Thay đổi mật khẩu');
    }

    public function post_change()
    {
        if (MyAuth::guest()) return Redirect::to('/');

        $rules = array(
            'password' => 'required|min:6:max64',
            'repassword' => 'same:password',
        );

        $validators = \Laravel\Validator::make(Input::get(), $rules,
            array(
                'password_required' => 'Vui lòng không để trống mật khẩu!',
                'password_min' => 'Yêu cầu mật khẩu tối thiểu :min kí tự',
                'repassword_same' => 'Nhập lại mật khẩu không khớp',
            ));

        if (!Hash::check(Input::get('old_password'), MyAuth::user()->password)) {
            $validators->errors->add('old_password', 'Mật khẩu củ không chính xác');
        }

        if ($validators->fails()) {
            return Redirect::to(URI::current())->with_errors($validators->errors)->with_input();
        } else {
            MyAuth::user()->password = Input::get('password');
            MyAuth::user()->save();
            Return Shared::make_message(array(
                'content' => 'Thay đổi mật khẩu thành công!',
                'redirect_url' => '/',
            ));
        }
    }

    public function get_index()
    {
        return View::make('user.panel')
            ->with('user', MyAuth::user())
            ->with('title', 'Người dùng');
    }

    public function get_forgot()
    {
        return View::make('user.forgot');
    }

    public function post_forgot()
    {
        $validator = Validator::make(Input::get(), array(
            'username' => 'required|min:4|max:64',
            'captcha' => 'required|captcha'
        ), Config::get('messages'));
        if ($validator->fails()) {
            return Redirect::to(URI::current())->with_errors($validator->errors);
        }

        $user = User::where_username(Input::get('username'))->first();
        if (is_null($user)) {
            $validator->errors->add('username', "Tên đăng nhập [" . Input::get('username') . "] không tồn tại!");
            return Redirect::to(URI::current())->with_errors($validator->errors);
        }

        $user->email_sent = -1;
        $user->save();

        $email = substr($user->email, 0 , 3) . '****' . substr($user->email, 7);

        return message_page(array(
            'content' => "Chúng tôi đã gửi một email đến địa chỉ <strong>[$email]</strong>, bạn vui lòng sử dụng liên kết trong đó để khôi phục mật khẩu",
            'title' => 'Khôi phục mật khẩu'
        ));
    }

    public function get_recover()
    {
        $validator = Validator::make(Input::get(), array(
            'secret' => 'required|numeric',
            'code' => 'required|min:10|max:10',
        ));
        if ($validator->fails()) {
            return message_page(array(
                'content' => 'Thông tin không chính xác, không thể thực hiện thao tác!',
                'title' => 'Truy cập bị từ chối',
                'type' => 'error'
            ));
        } else {
            $user = User::where_id(Input::get('secret'))->where_verify_code(Input::get('code'))->first();
            if (is_null($user)) {
                return message_page(array(
                    'content' => 'Thông tin không chính xác, không thể thực hiện thao tác!',
                    'title' => 'Truy cập bị từ chối',
                    'type' => 'error'
                ));
            } else {
                Session::put('RECOVER_ID', $user->id);
                return View::make('user.recover');
            }
        }
    }

    public function post_recover()
    {
        $validator = Validator::make(Input::get(), array(
            'password' => 'required|min:6|max:64',
            'repassword' => 'required|min:6|max:64|same:password',
        ));

        if ($validator->fails()) {
            return Redirect::to(URI::current())->with_errors($validator);
        }
        $user = Session::get('RECOVER_ID');
        if (is_null($user)) {
            return message_page(array(
                'content' => 'Thông tin không chính xác, không thể thực hiện thao tác!',
                'title' => 'Truy cập bị từ chối',
                'type' => 'error'
            ));
        } else {
            $user = User::find($user);
            $user->password = Input::get('password');
            $user->verify_code = null;
            $user->save();

            return message_page(array(
                'content' => 'Cập nhật mật khẩu thành công, bạn có thể đăng nhập bằng mật khẩu mới!',
                'title' => 'Phục hồi mật khẩu thành công',
            ));
        }
    }


    /** Kiểm tra tồn tại email, username */
    public function post_exists()
    {
        if (!Input::has('type') || !Input::has('needed')) {
            return Response::make("Not enough data to process", 500);
        }
        $type = Input::get('type');
        $needed = Input::get('needed');

        // Nếu người dùng đã đăng nhập rồi thì thông tin hiện tại của người đó hợp lệ
        // Ngược lại kiểm tra thông tin trong DB
        $status = (User::exists($type, $needed)) && (MyAuth::check() && MyAuth::user()->$type !== $needed);
        return \Laravel\Response::json(array('code' => $status));
    }

}